﻿
#region 版权声明





//



// 
// 代码开源主要用于解决大家在学习和研究协议过程中遇到由于缺乏代码所带来的制约性问题。
// 本代码仅供学习交流使用，大家在使用此开发包前请自行协调好多方面关系，
// 不得用于任何商业用途和非法用途，本人不享受和承担由此产生的任何权利以及任何法律责任。
// 
// 本源代码可通过以下网址获取:
// http://www.vckers.com
//
// Copyright @ 2009-2010  vckers.com.  All Rights Reserved.   
// Framework: 3.5

  

 
//   
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details. 
  
#endregion

using System;
using System.Collections.Generic;
using System.Text;

using TS.QQ.Packets;

namespace TS.QQ.Threading
{
    /// <summary>包括处理触发器
    /// </summary>
    public class PacketIncomeTrigger : ICallable
    {
        private QQClient client;
        public PacketIncomeTrigger(QQClient client)
        {
            this.client = client;
        }
        #region ICallable Members

        /// <summary>
    /// </summary>
        /// <value></value>
        public bool IsRunning
        {
            get;
            private set;
        }

        /// <summary>
        /// WaitCallback回调
    /// </summary>
        /// <param name="state">The state.</param>
        public void Call(object state)
        {
            if (!IsRunning)
            {
                lock (this)
                {
                    if (!IsRunning)
                    {
                        IsRunning = true;
                        InPacket inPacket = client.PacketManager.RemoveIncomingPacket();
                        while (inPacket != null)
                        {
                            client.PacketManager.FirePacketArrivedEvent(inPacket);
                            inPacket = client.PacketManager.RemoveIncomingPacket();
                        }
                        IsRunning = false;
                    }
                }

            }
        }

        #endregion
    }
}
